home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / xlisp_21.zoo / xlspeed.dif < prev    next >
Internet Message Format  |  1990-02-28  |  47KB

  1. From sce!mitel!uunet!lll-winken!ames!haven!umd5!jonnyg Tue May 23 15:37:24 EDT 1989
  2. Article: 91 of comp.lang.lisp.x
  3. Path: cognos!sce!mitel!uunet!lll-winken!ames!haven!umd5!jonnyg
  4. From: jonnyg@umd5.umd.edu (Jon Greenblatt)
  5. Newsgroups: comp.lang.lisp.x
  6. Subject: Xlisp2.0 speedups... (Part 1 of 3)
  7. Message-ID: <4912@umd5.umd.edu>
  8. Date: 18 May 89 16:58:56 GMT
  9. Reply-To: jonnyg@umd5.umd.edu (Jon Greenblatt)
  10. Organization: University of Maryland, College Park
  11. Lines: 910
  12.  
  13. The following are changes I have made to xlisp 2.0 source. Most of these
  14. changes produce considerable speed ups. This distribution is very
  15. rough but maybe someone can wade through it and come of with a cleaned
  16. up version of the speed ups. Note this is a striaght context diff so
  17. more than just the speed ups are included, BEWARE! If you are able to
  18. clean up or enhance these speed ups in any way I would apreciate the
  19. feedback.
  20.  
  21.                 JonnyG.
  22.  
  23. diff -c ../xlisp.org/xlbfun.c ../xlisp/xlbfun.c
  24. *** ../xlisp.org/xlbfun.c    Sun May  7 22:25:38 1989
  25. --- ../xlisp/xlbfun.c    Wed Apr  5 16:18:23 1989
  26. ***************
  27. *** 558,563 ****
  28. --- 558,578 ----
  29.       return (val);
  30.   }
  31.   
  32. + LVAL xcopyarray()
  33. + {
  34. +     LVAL src, dest;
  35. +     int num;
  36. +     register int i;
  37. +     src = xlgavector();
  38. +     dest = xlgavector();
  39. +     xllastarg();
  40. +     num = (getsize(src) < getsize(dest)) ? getsize(src) : getsize(dest);
  41. +     for (i = 0; i < num; i++)
  42. +         setelement(dest,i,getelement(src,i));
  43. +     return(dest);
  44. + }
  45.   /* xerror - special form 'error' */
  46.   LVAL xerror()
  47.   {
  48. diff -c ../xlisp.org/xldbug.c ../xlisp/xldbug.c
  49. *** ../xlisp.org/xldbug.c    Sun May  7 22:25:43 1989
  50. --- ../xlisp/xldbug.c    Wed Apr  5 16:18:24 1989
  51. ***************
  52. *** 14,20 ****
  53.   extern char buf[];
  54.   
  55.   /* external routines */
  56. ! extern char *malloc();
  57.   
  58.   /* forward declarations */
  59.   FORWARD LVAL stacktop();
  60. --- 14,20 ----
  61.   extern char buf[];
  62.   
  63.   /* external routines */
  64. ! extern char *xlmalloc();
  65.   
  66.   /* forward declarations */
  67.   FORWARD LVAL stacktop();
  68. diff -c ../xlisp.org/xldmem.c ../xlisp/xldmem.c
  69. *** ../xlisp.org/xldmem.c    Sun May  7 22:25:46 1989
  70. --- ../xlisp/xldmem.c    Wed Apr  5 16:18:25 1989
  71. ***************
  72. *** 6,13 ****
  73.   #include "xlisp.h"
  74.   
  75.   /* node flags */
  76. ! #define MARK    1
  77. ! #define LEFT    2
  78.   
  79.   /* macro to compute the size of a segment */
  80.   #define segsize(n) (sizeof(SEGMENT)+((n)-1)*sizeof(struct node))
  81. --- 6,13 ----
  82.   #include "xlisp.h"
  83.   
  84.   /* node flags */
  85. ! #define MARK    0x20
  86. ! #define LEFT    0x40
  87.   
  88.   /* macro to compute the size of a segment */
  89.   #define segsize(n) (sizeof(SEGMENT)+((n)-1)*sizeof(struct node))
  90. ***************
  91. *** 21,37 ****
  92.   SEGMENT *segs,*lastseg,*fixseg,*charseg;
  93.   int anodes,nsegs,gccalls;
  94.   long nnodes,nfree,total;
  95. ! LVAL fnodes;
  96.   
  97.   /* external procedures */
  98. ! extern char *malloc();
  99. ! extern char *calloc();
  100.   
  101.   /* forward declarations */
  102. ! FORWARD LVAL newnode();
  103.   FORWARD unsigned char *stralloc();
  104.   FORWARD SEGMENT *newsegment();
  105.   
  106.   /* cons - construct a new cons node */
  107.   LVAL cons(x,y)
  108.     LVAL x,y;
  109. --- 21,50 ----
  110.   SEGMENT *segs,*lastseg,*fixseg,*charseg;
  111.   int anodes,nsegs,gccalls;
  112.   long nnodes,nfree,total;
  113. ! LVAL fnodes = NIL;
  114.   
  115.   /* external procedures */
  116. ! extern char *xlmalloc();
  117. ! extern char *xlcalloc();
  118.   
  119.   /* forward declarations */
  120. ! FORWARD LVAL Newnode();
  121.   FORWARD unsigned char *stralloc();
  122.   FORWARD SEGMENT *newsegment();
  123.   
  124. + LVAL _nnode;
  125. + FIXTYPE _tfixed;
  126. + int _tint;
  127. + #define    newnode(type) (((_nnode = fnodes) != NIL) ? \
  128. +             ((fnodes = cdr(_nnode)), \
  129. +              nfree--, \
  130. +              (_nnode->n_type = type), \
  131. +              rplacd(_nnode,NIL), \
  132. +              _nnode) \
  133. +             : (_nnode = Newnode(type)))
  134.   /* cons - construct a new cons node */
  135.   LVAL cons(x,y)
  136.     LVAL x,y;
  137. ***************
  138. *** 129,140 ****
  139.   }
  140.   
  141.   /* cvfixnum - convert an integer to a fixnum node */
  142. ! LVAL cvfixnum(n)
  143.     FIXTYPE n;
  144.   {
  145.       LVAL val;
  146. -     if (n >= SFIXMIN && n <= SFIXMAX)
  147. -     return (&fixseg->sg_nodes[(int)n-SFIXMIN]);
  148.       val = newnode(FIXNUM);
  149.       val->n_fixnum = n;
  150.       return (val);
  151. --- 142,151 ----
  152.   }
  153.   
  154.   /* cvfixnum - convert an integer to a fixnum node */
  155. ! LVAL Cvfixnum(n)
  156.     FIXTYPE n;
  157.   {
  158.       LVAL val;
  159.       val = newnode(FIXNUM);
  160.       val->n_fixnum = n;
  161.       return (val);
  162. ***************
  163. *** 151,157 ****
  164.   }
  165.   
  166.   /* cvchar - convert an integer to a character node */
  167. ! LVAL cvchar(n)
  168.     int n;
  169.   {
  170.       if (n >= CHARMIN && n <= CHARMAX)
  171. --- 162,168 ----
  172.   }
  173.   
  174.   /* cvchar - convert an integer to a character node */
  175. ! LVAL Cvchar(n)
  176.     int n;
  177.   {
  178.       if (n >= CHARMIN && n <= CHARMAX)
  179. ***************
  180. *** 180,185 ****
  181. --- 191,225 ----
  182.       return (val);
  183.   }
  184.   
  185. + #ifdef    WINDOWS
  186. + LVAL newwinobj(size)
  187. + int size;
  188. + {
  189. +     LVAL val;
  190. +     val = newnode(WINOBJ);
  191. +     if (size > 0) {
  192. +         xlprot1(val);
  193. +         if ((val->n_winobj = xldcalloc(1,size)) == NULL) {
  194. +             findmem();
  195. +             if ((val->n_winobj = xldcalloc(1,size)) == NULL)
  196. +                 xlfail("insufficient memory");
  197. +             }
  198. +         xlpop();
  199. +         }
  200. +     else val->n_winobj = NULL;
  201. +     return(val);
  202. + }
  203. + LVAL cvwinobj(p)
  204. + char *p;
  205. +     {
  206. +     LVAL val;
  207. +     val = newnode(WINOBJ);
  208. +     val->n_winobj = p;
  209. +     return(val);
  210. +     }
  211. + #endif
  212.   /* newclosure - allocate and initialize a new closure */
  213.   LVAL newclosure(name,type,env,fenv)
  214.     LVAL name,type,env,fenv;
  215. ***************
  216. *** 204,212 ****
  217.       vect = newnode(VECTOR);
  218.       vect->n_vsize = 0;
  219.       if (bsize = size * sizeof(LVAL)) {
  220. !     if ((vect->n_vdata = (LVAL *)calloc(1,bsize)) == NULL) {
  221.           findmem();
  222. !         if ((vect->n_vdata = (LVAL *)calloc(1,bsize)) == NULL)
  223.           xlfail("insufficient vector space");
  224.       }
  225.       vect->n_vsize = size;
  226. --- 244,252 ----
  227.       vect = newnode(VECTOR);
  228.       vect->n_vsize = 0;
  229.       if (bsize = size * sizeof(LVAL)) {
  230. !     if ((vect->n_vdata = (LVAL *)xldcalloc(1,bsize)) == NULL) {
  231.           findmem();
  232. !         if ((vect->n_vdata = (LVAL *)xldcalloc(1,bsize)) == NULL)
  233.           xlfail("insufficient vector space");
  234.       }
  235.       vect->n_vsize = size;
  236. ***************
  237. *** 217,223 ****
  238.   }
  239.   
  240.   /* newnode - allocate a new node */
  241. ! LOCAL LVAL newnode(type)
  242.     int type;
  243.   {
  244.       LVAL nnode;
  245. --- 257,263 ----
  246.   }
  247.   
  248.   /* newnode - allocate a new node */
  249. ! LVAL Newnode(type)
  250.     int type;
  251.   {
  252.       LVAL nnode;
  253. ***************
  254. *** 248,256 ****
  255.       unsigned char *sptr;
  256.   
  257.       /* allocate memory for the string copy */
  258. !     if ((sptr = (unsigned char *)malloc(size)) == NULL) {
  259.       gc();  
  260. !     if ((sptr = (unsigned char *)malloc(size)) == NULL)
  261.           xlfail("insufficient string space");
  262.       }
  263.       total += (long)size;
  264. --- 288,296 ----
  265.       unsigned char *sptr;
  266.   
  267.       /* allocate memory for the string copy */
  268. !     if ((sptr = (unsigned char *)xldmalloc(size)) == NULL) {
  269.       gc();  
  270. !     if ((sptr = (unsigned char *)xldmalloc(size)) == NULL)
  271.           xlfail("insufficient string space");
  272.       }
  273.       total += (long)size;
  274. ***************
  275. *** 330,336 ****
  276.     LVAL ptr;
  277.   {
  278.       register LVAL this,prev,tmp;
  279. !     int type,i,n;
  280.   
  281.       /* initialize */
  282.       prev = NIL;
  283. --- 370,376 ----
  284.     LVAL ptr;
  285.   {
  286.       register LVAL this,prev,tmp;
  287. !     register int i,n;
  288.   
  289.       /* initialize */
  290.       prev = NIL;
  291. ***************
  292. *** 340,380 ****
  293.       for (;;) {
  294.   
  295.       /* descend as far as we can */
  296. !     while (!(this->n_flags & MARK))
  297.   
  298.           /* check cons and symbol nodes */
  299. !         if ((type = ntype(this)) == CONS) {
  300. !         if (tmp = car(this)) {
  301. !             this->n_flags |= MARK|LEFT;
  302. !             rplaca(this,prev);
  303. !         }
  304. !         else if (tmp = cdr(this)) {
  305. !             this->n_flags |= MARK;
  306.               rplacd(this,prev);
  307. !         }
  308. !         else {                /* both sides nil */
  309. !             this->n_flags |= MARK;
  310.               break;
  311. !         }
  312. !         prev = this;            /* step down the branch */
  313. !         this = tmp;
  314. !         }
  315. !         /* mark other node types */
  316.           else {
  317. !         this->n_flags |= MARK;
  318. !         switch (type) {
  319. !         case SYMBOL:
  320. !         case OBJECT:
  321. !         case VECTOR:
  322. !         case CLOSURE:
  323. !             for (i = 0, n = getsize(this); --n >= 0; ++i)
  324. !             if (tmp = getelement(this,i))
  325. !                 mark(tmp);
  326. !             break;
  327. !         }
  328. !         break;
  329. !         }
  330.   
  331.       /* backup to a point where we can continue descending */
  332.       for (;;)
  333. --- 380,409 ----
  334.       for (;;) {
  335.   
  336.       /* descend as far as we can */
  337. !     while (!(this->n_type & MARK))
  338.   
  339.           /* check cons and symbol nodes */
  340. !         if ((i = (this->n_type |= MARK) & TY